
<?php

/* 11/08/2011

   Modulo donde se efectuaran las trasacciones entre usuarios
   que seran llamados por el servicio web (Representational State Transfer)

 -trim       = elimina espacion en blanco en la cadena.
 -strtolower = toda la cadena a minuscula.

 */
class xml_servicio_pagosActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {

  }

public function executeCompra_twocheckout_usuario_paquete(sfWebRequest $request){

    $request->setRequestFormat('json');
     $recurso = new myLib();


     // recibo parametros
     //recibiendo parametros
        $repuesta_transaccion = $request->getParameter('credit_card_processed');
        $num_orden_twocheckout = $request->getParameter('order_number');
        $num_pedido_local = $request->getParameter('merchant_order_id');
        $nombre_comprador_twocheckout = $request->getParameter('ship_name');
        //$codigo_2checkout = $request->getParameter('');
        $monto_total = $request->getParameter('total');
        $codigo2checkout_producto = $request->getParameter('product_id');
        $token = $request->getParameter('token');


     if($repuesta_transaccion != null){
         if($repuesta_transaccion == "Y"){
             // transaccion correcta
                         try{
                    $con = Propel::getConnection();
                    $con->beginTransaction();
                    $fecha = date("Y-m-d G:i");
                    //$token_seguridad = $request->getParameter('token');

                   if($recurso->executeToken($token_seguridad)){ //valida token de seguridad

                    $fecha = time("d/m/a");
                    //$monto_compra = $request->getParameter('monto_compra');


                    // 1 --> busco el paquete
                    $objeto_paquete = $recurso->executeRetorna_paquete_by_2checkoutId($codigo_2checkout);
                    if(is_object($objeto_paquete)){
                        //registro todos los datos recibidos de 2checkout
                        if($num_orden_twocheckout != null){

                                if($num_pedido_local != null){

                                     if($monto_total !=null){ // verifico el monto recibido de twocheckout

                                        $objeto_pedido_local = $recurso->executeRetorna_pedido($num_pedido_local);
                                         if(is_object($objeto_pedido_local)){
                                            // registro tabla twocheckout
                                            try{
                                               if($nombre_comprador_twocheckout != null){

                                                $new_reg_twocheckout = new Twocheckout();
                                                $new_reg_twocheckout->setNumPedido($num_pedido_local);
                                                $new_reg_twocheckout->setNumOrdenTwocheckout($num_orden_twocheckout);
                                                $new_reg_twocheckout->setEstado("exito");
                                                $new_reg_twocheckout->setUsuarioData($nombre_comprador_twocheckout);
                                                $new_reg_twocheckout->save();


                                                }else{
                                                // no recibio parametro de 2checkout numero_pedido_local
                                                 $this->success = false;
                                                 $this->code_rpt = 2001;
                                                 $this->message = 'no recibio parametro de 2checkout numero_pedido_local';
                                                 $con->rollback();

                                                }


                                            }catch (Exception $e){
                                                // no grabo correctamente la tabla Twocheckout
                                                  $this->success = false;
                                                 $this->code_rpt = 2002;
                                                 $this->message = 'no grabo correctamente la tabla Twocheckout';
                                                 $con->rollback();
                                            }

                                            // registro tabla   usuario_paquete
                                            try{

                                                //verifico usuario
                                                $obj_usuario = $recurso->executeRetorna_usuario($objeto_pedido_local->getUsuarioId());
                                                    if(is_object($obj_usuario)){ //existe usuario en la bd

                                                            $new_paquete_usuario = new UsuarioPaquete();
                                                            $new_paquete_usuario ->setFechaCompra($fecha);
                                                            $new_paquete_usuario->setPrecioComprado($monto_total);
                                                            $new_paquete_usuario->setUsuarioId($obj_usuario->getId());
                                                            $new_paquete_usuario->setPaqueteId($objeto_paquete->getId());
                                                            $new_paquete_usuario->setTwocheckoutId($new_reg_twocheckout->getId());

                                                    }else{

                                                    //no existe usuario en la bd
                                                 $this->success = false;
                                                 $this->code_rpt = 2003;
                                                 $this->message = 'No existe usuario en la bd';
                                                 $con->rollback();

                                                    }

                                                }catch (Exception $e){
                                                // ERROR EN REGISTRAR LA TABLA USUARIO_PAQUETE

                                                 $this->success = false;
                                                 $this->code_rpt = 2004;
                                                 $this->message = 'ERROR EN REGISTRAR LA TABLA USUARIO_PAQUETE';
                                                 $con->rollback();
                                                }

                                            //Actualizo tabla pedidos

                                            try{

                                                    $objeto_pedido_local->setEstado("Exito");
                                                    $objeto_pedido_local->save();
                                                    $this->success = true;
                                                    $this->code_rpt = 2005;
                                                    $this->message = 'Exito en la compra';

                                                    $con->commit();

                                            }catch(Exception $e){
                                                // no actualizo tabla pedido
                                                 $this->success = false;
                                                 $this->code_rpt = 2006;
                                                 $this->message = 'No Actualizo estado de tabla pedidos ';
                                                 $con->rollback();
                                            }

                                        }else{
                                            // no existe pedido en la base de datos
                                             $this->success = false;
                                                 $this->code_rpt = 2007;
                                                 $this->message = 'No existe pedido en la base de datos';
                                                 $con->rollback();

                                        }
                                   }else{
                                       // parametro monto vacio
                                          $this->success = false;
                                                 $this->code_rpt = 2008;
                                                 $this->message = 'Parametro monto vacio';
                                                 $con->rollback();
                                   }
                                  }else{
                                  // No existe numero de pedido local
                                 $this->success = false;
                                                 $this->code_rpt = 2009;
                                                 $this->message = 'No existe numero del pedido local';
                                                 $con->rollback();
                                  }


                        }else{
                             // numero de orden vacio o null
                               $this->success = false;
                                                 $this->code_rpt = 2009;
                                                 $this->message = 'numero de orden vacio o null';
                                                 $con->rollback();
                        }
                        }else{
                           $this->success = false;
                           $this->code_rpt = 2009;
                           $this->message = 'No existe paquete en plataforma';
                           $con->rollback();
                             return sfView::ERROR;
                        }

                      }else{
                       $this->success = false;
                       $this->code_rpt = 2010;
                       $this->message = 'Error en el token!';

                       $con->rollback();
                    }
                   }catch(Exection $e){
                       $this->success = false;
                       $this->code_rpt = 2010;
                       $this->message = 'Error general en la transaccion';

                       $con->rollback();
                   }

         }else{
           // transaccion incorrecta
                  return sfView::ERROR;
         }
     }else{
         // no se recibio respuesta de 2checkout
          return sfView::ERROR;
     }
     

  }

public function executeCompra_paqueteusuario(sfWebRequest $request){
     $request->setRequestFormat('xml');
     $recurso = new myLib();

     try{
        $con = Propel::getConnection();
        $con->beginTransaction();

        $token_seguridad = $request->getParameter('token');
      if($recurso->executeToken($token_seguridad)){ //valida token de seguridad

        //recibiendo parametros
        $fecha = time("d/m/a");
        $monto_compra = $request->getParameter('monto_compra');
        $usuario_comprador_id = $request->getParameter('codigo_usuario');
        $paquete_id = $request->getParameter('paquete_id');
        $estado_compra = $request->getParameter('estado');
        //verifico si el monto enviado es igual al costo del paquete
        //busco el paquete
        $objeto_paquete = $recurso->executeRetorna_paquete($paquete_id);
        if(is_object($objeto_paquete)){
            if($objeto_paquete->getPrecioActual()==$monto_compra){
        //verifico si el usuario puede comprar el paqiuete segin su credito
        //busco usuario
        $objeto_usuario = $recurso->executeRetorna_usuario($usuario_comprador_id);
        if(is_object($objeto_usuario)){

        //verifico que el usuario no haya comprado el paquete o que no lo tenga en estado habilitado
        $paquetes_habilitados = $recurso->executePaquetes_usuarios($objeto_usuario->getId(),$objeto_paquete->getId());
        if($paquetes_habilitados == true){
            $this->respuesta = "3019";
            return sfView::ERROR;
        }else{
            $monto_actual_usuario = $objeto_usuario->getCredito();
            if($monto_actual_usuario>= $monto_compra){
                //primero busco si exite en la tabla Usuario_paquete un registro
                //con el estado habilitado
                try{
                $busqueda_usuario_paquete = new Criteria();
                $busqueda_usuario_paquete->add(UsuarioPaquetePeer::USUARIO_ID, $objeto_usuario->getId());
                $busqueda_usuario_paquete->add(UsuarioPaquetePeer::FLAGS, "%H%", Criteria::LIKE);

                $numero_registros = UsuarioPaquetePeer::doCount($busqueda_usuario_paquete);
                if($numero_registros > 0){
                $regitro_encontrado =  UsuarioPaquetePeer::doSelectOne($busqueda_usuario_paquete);
                $regitro_encontrado ->setFlags("D");
                $regitro_encontrado->save();
                }

               }catch(Exception $e){
               $con->rollback();
              throw $e;
              $this->respuesta = "3020";
              return sfView::ERROR;
                }
                //ingreso datos a latabla Usuario_paquete
                try{
                $new_usuario_paquete = new UsuarioPaquete();
                $new_usuario_paquete->setFechaCompra($fecha);
                $new_usuario_paquete->setUsuarioId($usuario_comprador_id);
                $new_usuario_paquete->setPaqueteId($paquete_id);
                $new_usuario_paquete->setPrecioComprado($monto_compra);
                //CALCULO FECHA DE RENOVACION PARA EL PAQUETE
                    //1) Obtengo la caracteristica duracion del paquete
               $listas_caracteristicas = $recurso->executeRetorna_caracteristicas_paquetes($objeto_paquete->getId());
        if(count($listas_caracteristicas)>0){
        foreach ($listas_caracteristicas as $item_carac){
        if($item_carac->getPaqueteCaracteristica()->getDescripcion() == "Duracion_paquete")
            $duracion_paq = $item_carac->getDescripcion();

        }
        }
                $fecha_calculada =  $this->execute_calcular_fechas($duracion_paq);
                if($fecha_calculada!=0){
                   /*
                 *
                 * Guardo con JSON en Flags
                 *
                 */
                $flags =  json_encode(array(
		"estado"	=> "H"	,   //ESTADO HABILITADO
                "caducacion"	=> $fecha_calculada
               ));
                 $new_usuario_paquete->setFlags($flags);

                }
                  else{
                     //$new_consumo_usuario->setFechaRenovacion($fecha);
                        $this->code = "4002";
                        $this->respuesta = "Error en funcion de Fechas";
                        $con->rollback();
                        return sfView::ERROR;

                    }

                $new_usuario_paquete->save();
                }catch(Exception $e){
              $con->rollback();
              throw $e;
              $this->respuesta = "1016";
              return sfView::ERROR;
                }
                try{
                   $objeto_usuario->setCredito($objeto_usuario->getCredito()-$monto_compra);
                   $objeto_usuario->save();

               }catch(Exception $e){
              $con->rollback();
              throw $e;
              $this->respuesta = "3011";
              return sfView::ERROR;
               }
               try{
                 $new_cuenta_usuario = new EstadoCuentaUsuario();
                 $new_cuenta_usuario->setMonto($monto_compra);
                 $new_cuenta_usuario->setFechaTrasaccion($fecha);
                 $new_cuenta_usuario->setDescripcionTrasaccion("Compra de´Paquete :".$objeto_paquete->getDescripcion());
                 $new_cuenta_usuario->setMovimientoOperacion("S");
                 $new_cuenta_usuario->setUsuarioId($objeto_usuario->getId());
                 $new_cuenta_usuario->save();
                  $con->commit();
                  $this->respuesta = "3010";
                  $this->cod_usuario_paq = $new_usuario_paquete->getId();
                  return sfView::SUCCESS;
                 }catch(Exception $e){
                 $con->rollback();
                   throw $e;
                   $this->respuesta = "3013";
                 return sfView::ERROR;
                 }

            }else{
                $this->respuesta = "3005";
                return sfView::ERROR;
            }
        }

        }else{
            $this->respuesta = "3015";
             return sfView::ERROR;
            }
            }else{
                $this->respuesta = "3017";
                 return sfView::ERROR;
            }
            }else{
                $this->respuesta = "3018";
                 return sfView::ERROR;
            }

            }else{
                $this->respuesta = "3002";
             return sfView::ERROR;
        }
       }catch(Exection $e){
           $this->respuesta = "3001";
           $con->rollback();
       }

}
  public function executeDeposito_usuarios(sfWebRequest $request)
  {
    $request->setRequestFormat('xml');
    $fecha = Time("d/m/a");
    $usuario_id = $request->getParameter('codigo_usuario');
    $monto_de_deposito = $request->getParameter('monto_deposito');
    $tipo_moneda_id = $request->getParameter('moneda_id');
    $numero_orden = $request->getParameter('num_orden');
    $recurso = new myLib();

    try {
       $con = Propel::getConnection();
        $token_seguridad = $request->getParameter('token');
        if($recurso->executeToken($token_seguridad)){
         if($recurso->executeExiste_usuario($usuario_id)){
             if($recurso->executeExiste_moneda($tipo_moneda_id)){
                $monto_procesado = 0;
                 try{
                 $moneda_seleccionada = $recurso->executeRetorna_moneda($tipo_moneda_id);
                 $tipo_de_cambio = $moneda_seleccionada->getTipoCambio();
                 $monto_procesado = $monto_de_deposito / $tipo_de_cambio;
                 $usuario_abono = $recurso->executeRetorna_usuario($usuario_id);
                 $usuario_abono->setCredito($usuario_abono->getCredito() + $monto_procesado);
                 $usuario_abono->save();
                 }catch(Exception $e){
              $con->rollback();
              throw $e;
              $this->respuesta = "3011";
              return sfView::ERROR;
                 }

                 try{

                  $new_registro_deposito = new UsuarioDeposito();
                  $new_registro_deposito->setNumOrden($numero_orden);
                  $new_registro_deposito->setMontoDepositado($monto_de_deposito);
                  $new_registro_deposito->setMontoConvertido($monto_procesado);
                  $new_registro_deposito->setFechaDeposito($fecha);
                  $new_registro_deposito->setTipoMonedaId($tipo_moneda_id);
                  $new_registro_deposito->setUsuarioId($usuario_id);
                  $new_registro_deposito->save();

                 }catch(Exception $e){
                   $con->rollback();
                   throw $e;
                   $this->respuesta = "3012";
                 return sfView::ERROR;
                 }
                try{
                 $new_cuenta_usuario = new EstadoCuentaUsuario();
                 $new_cuenta_usuario->setMonto($monto_procesado);
                 $new_cuenta_usuario->setFechaTrasaccion($fecha);
                 $new_cuenta_usuario->setDescripcionTrasaccion("Recarga de Saldo a Cuenta");
                 $new_cuenta_usuario->setMovimientoOperacion("E");
                 $new_cuenta_usuario->setUsuarioId($usuario_id);
                 $new_cuenta_usuario->save();
                 $con->commit();
                  $this->respuesta = "3010";
                 }catch(Exception $e){
                 $con->rollback();
                   throw $e;
                   $this->respuesta = "3013";
                   return sfView::ERROR;
                 }
             }else{
                 $this->respuesta = "3014";
                 return sfView::ERROR;
             }
         }else{
             $this->respuesta = "3015";
                 return sfView::ERROR;
         }
        }else{
            $this->respuesta = "3002";
                 return sfView::ERROR;
        }
    }catch(Exception $e){
         $con->rollback();
                   throw $e;
                   $this->respuesta = "3001";
                 return sfView::ERROR;
    }
  }
 public function executeTrasferencias_usuarios(sfWebRequest $request)
  {
     $request->setRequestFormat('xml');
     $usuario_emisor = $request->getParameter('id_usu_emisor');
     $usuario_receptor = $request->getParameter('id_usu_receptor');
     $monto_trasferecia = $request->getParameter('monto_transferencia');
     $token_seguridad = $request->getParameter('token');
     $fecha = Time("d/m/a");
     $recurso = new myLib();

    try{
        $con = Propel::getConnection();
        if($recurso->executeToken($token_seguridad)){
             if($recurso->executeExiste_usuario($usuario_emisor)){
                if($recurso->executeExiste_usuario($usuario_receptor)){
                   $usuario_emisor_busqueda = $recurso->executeRetorna_usuario($usuario_emisor);
                   $credito_actual = $usuario_emisor_busqueda->getCredito();
                   if($credito_actual >= $monto_trasferecia ){
                       try {
                            $usuario_emisor_busqueda->setCredito($credito_actual - $monto_trasferecia);
                           $usuario_emisor_busqueda->save();
                       }catch(Exception $e){
                             $con->rollback();
                               throw $e;
                            $this->respuesta = "3009";
                                return sfView::ERROR;
                       }
                       try{
                           $usuario_receptor_busqueda =  $recurso->executeRetorna_usuario($usuario_receptor);
                           $usuario_receptor_busqueda->setCredito($usuario_receptor_busqueda->getCredito() + $monto_trasferecia);
                           $usuario_receptor_busqueda->save();
                       }catch(Exception $e){
                       $con->rollback();
                               throw $e;
                            $this->respuesta = "3008";
                                return sfView::ERROR;
                       }
                       try{
                        $new_registro_trasferecia = new UsuarioTrasferencia();
                        $new_registro_trasferecia->setUsuarioReceptorId($usuario_receptor);
                        $new_registro_trasferecia->setUsuarioEmisorId($usuario_emisor);
                        $new_registro_trasferecia->setFechaCreacion($fecha);
                        $new_registro_trasferecia->setMonto($monto_trasferecia);
                        $new_registro_trasferecia->save();

                       }catch(Exception $e){
                           $con->rollback();
                               throw $e;
                            $this->respuesta = "3007";
                                return sfView::ERROR;
                       }
                       try{
                 $new_cuenta_usuario = new EstadoCuentaUsuario();
                 $new_cuenta_usuario->setMonto($monto_trasferecia);
                 $new_cuenta_usuario->setFechaTrasaccion($fecha);
                 $new_cuenta_usuario->setDescripcionTrasaccion("Trasferecia de Saldo");
                 $new_cuenta_usuario->setMovimientoOperacion("S");
                 $new_cuenta_usuario->setUsuarioId($usuario_emisor);
                 $new_cuenta_usuario->save();
                 $con->commit();
                  $this->respuesta = "3010";
                 }catch(Exception $e){
                 $con->rollback();
                   throw $e;
                   $this->respuesta = "3006";
                   return sfView::ERROR;
                 }

                   }else{
                       $this->respuesta = "3005";
                        return sfView::ERROR;
                   }

         }else{
              $this->respuesta = "3004";
                 return sfView::ERROR;
         }
        }else{
              $this->respuesta = "3003 ";
              return sfView::ERROR;
        }
        }else{
             $this->respuesta = "3002";
                 return sfView::ERROR;
        }


    }catch(Exception $e){
            $con->rollback();
                   throw $e;
       $this->respuesta = "3001";
                 return sfView::ERROR;
    }
  }

  public function execute_calcular_fechas($cantidad_dias){

   try{
       print_r($cantidad_dias);
      //obtengo las fechas
      $mes =  date("m");
      $anio = date("Y");
      $dia =  date("d");
      // rescato el ultimo dia segun la fecha actual 19/09/2011  $ultimo_dia = 19
      $dia_actual = date( "d", mktime(0, 0, 0, $mes + 1, 0, $anio) ) ;
      //asigno la cantidad de dias que deseo sumar
      $dias_adelanto = $cantidad_dias;
      //sumo la cantidad de dias al dia actual
      $dias_sumados = $dia + $dias_adelanto;
      if ($dia_actual < $dias_sumados)
      {
         $dia_final = $dias_sumados - $dia_actual;
         $mes++;
         if ($mes == '13')
         {
            $anio++;
            $mes = '01';
         }
         $fecha_final = $anio.'-'.$mes.'-'.$dia_final;
         //$fecha_final = $dia_final.'/'.$mes.'/'.$anio;
          print_r($fecha_final);
      }
      else
      {
         $fecha_final = $anio.'-'.$mes.'-'.$dias_sumados ;
         // $fecha_final = $dias_sumados .'/'.$mes.'/'.$anio;
         print_r($fecha_final);
      }
      return $fecha_final;

 }catch(Exception $e){
    return 0;

   }

}


}
